package cn.songtx.iot.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;
import java.util.Map;

/*
 * 封装的工具类,提供3种方法
 * 1.生成token
 * 2.验证token
 * 3.获得token携带的信息
 * */
public class JWTUtils {
    private static final String SECRET = "hope4825";       // 签名/密钥,常量
    private static final Integer HOUR = 8;                 // 过期时间,小时,常量

    /*
     * 生成token的方法,可以携带一个Map内含多组k,v值
     * */
    public static String getToken(Map<String, String> map) {
        // 创建jwt builder
        JWTCreator.Builder builder = JWT.create();
        // 用forEach遍历需要携带的键值对
        map.forEach(builder::withClaim);
        // 设置密钥和过期时间,返回token
        return builder.withExpiresAt(new Date(System.currentTimeMillis() + HOUR * 3600 * 1000)) // 设置过期时间
                .sign(Algorithm.HMAC256(SECRET));          // 密钥
    }

    /*
     * 验证返回值不异常即通过,无返回值
     * */
    public static void verify(String token) {
        JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);
    }

    /*
     * 获取token信息的方法,传入token,返回token信息,DecodedJWT格式
     * */
    public static DecodedJWT getTokenInfo(String token) {
        return JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);
    }
}
